W32: RGBA GDK backend (broken)
authorРуслан Ижбулатов <lrn1986@gmail.com>
Sat, 29 Mar 2014 21:28:33 +0000 (21:28 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 10 Apr 2014 17:49:19 +0000 (17:49 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=727316

configure.ac
gdk/win32/gdkscreen-win32.c
gdk/win32/gdkvisual-win32.c
gdk/win32/gdkwindow-win32.c

index 462bcca90106093393879ab88be25a5c1687b222..0556016b67708582b1c0ed29d356f0b1e35cfda6 100644 (file)
@@ -363,6 +363,25 @@ fi
 AC_SUBST(ENABLE_ON_X11)
 
 if test "$enable_win32_backend" = "yes"; then
+  AC_MSG_CHECKING([for DWM])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+        #include <windows.h>
+        #include <dwmapi.h>
+      ]],
+      [[
+        DWM_BLURBEHIND bb;
+        memset (&bb, 0, sizeof (bb));
+        bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
+      ]]
+    )],
+    [dwm_ok=yes], [dwm_ok=no]
+  )
+  AC_MSG_RESULT($dwm_ok)
+  if test "$dwm_ok" = "yes"; then
+    AC_DEFINE([HAVE_W32_DWM], [1], [Define if W32 DWM API is available])
+  fi
+
   cairo_backends="$cairo_backends cairo-win32"
   GDK_BACKENDS="$GDK_BACKENDS win32"
   backend_immodules="$backend_immodules,ime"
index 8cab47117dca71217e6cba78f7e27822c3f13a96..d2c2dea1b724ffe744712f755f504ba8a35b396c 100644 (file)
@@ -211,7 +211,7 @@ gdk_win32_screen_class_init (GdkWin32ScreenClass *klass)
   screen_class->get_monitor_geometry = gdk_win32_screen_get_monitor_geometry;
   screen_class->get_monitor_workarea = gdk_win32_screen_get_monitor_geometry;
   screen_class->get_system_visual = _gdk_win32_screen_get_system_visual;
-  screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual;
+  screen_class->get_rgba_visual = _gdk_win32_screen_get_system_visual;
   screen_class->is_composited = gdk_win32_screen_is_composited;
   screen_class->make_display_name = gdk_win32_screen_make_display_name;
   screen_class->get_active_window = gdk_win32_screen_get_active_window;
index 34ee4340ed2e9cb4c9e94aeca0040d69e9e50c02..6f84db33b722163711bbcfdba0af0a9c80f52842 100644 (file)
@@ -194,7 +194,6 @@ _gdk_visual_init (GdkScreen *screen)
     }
   else if (bitspixel == 24 || bitspixel == 32)
     {
-      bitspixel = 24;
       system_visual->type = GDK_VISUAL_TRUE_COLOR;
       system_visual->red_mask   = 0x00FF0000;
       system_visual->green_mask = 0x0000FF00;
index aa8f5916ea6f8c162044ab7b1bb0612c432b577d..307a1fb840b4fccdfe92e2a3e60a19b9237e0d61 100644 (file)
@@ -38,6 +38,9 @@
 #include "gdkdisplayprivate.h"
 #include "gdkvisualprivate.h"
 #include "gdkwin32window.h"
+#ifdef HAVE_W32_DWM
+#include <dwmapi.h>
+#endif
 
 #include <cairo-win32.h>
 
@@ -684,6 +687,45 @@ _gdk_win32_display_create_window_impl (GdkDisplay    *display,
 
   if (attributes_mask & GDK_WA_CURSOR)
     gdk_window_set_cursor (window, attributes->cursor);
+
+/* HAVE_W32_DWM means that we have necessary declarations at compile-time,
+ * but we'd still like to be able to run on XP, so we'll load the only non-XP
+ * function we need here at runtime.
+ */
+#ifdef HAVE_W32_DWM
+  {
+    typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND,
+        const DWM_BLURBEHIND *);
+    HMODULE dwmdll;
+    PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL;
+
+    dwmdll = GetModuleHandle ("dwmapi.dll");
+    dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow)
+        GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow");
+
+    if (dwmEnableBlurBehindWindow)
+      {
+        /* Enable blurbehind, but give it an empty region, leaving us
+           with all the transparency with none of the blur */
+        DWM_BLURBEHIND bb;
+        HRGN hRgn;
+        hRgn = CreateRectRgn (0, 0, -1, -1);
+        if (hRgn != NULL)
+          {
+            HRESULT hr;
+            memset (&bb, 0, sizeof (bb));
+            bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
+            bb.hRgnBlur = hRgn;
+            bb.fEnable = TRUE;
+            hr = dwmEnableBlurBehindWindow (GDK_WINDOW_HWND (window), &bb);
+            if (S_OK != hr)
+              g_warning ("%s: %s failed: %" G_GINT64_MODIFIER "x", G_STRLOC,
+                  "DwmEnableBlurBehindWindow", (guint64) hr);
+            DeleteObject (hRgn);
+          }
+      }
+  }
+#endif
 }
 
 GdkWindow *
@@ -3387,7 +3429,7 @@ gdk_win32_ref_cairo_surface (GdkWindow *window)
       if (!hdc)
        return NULL;
 
-      impl->cairo_surface = cairo_win32_surface_create (hdc);
+      impl->cairo_surface = cairo_win32_surface_create_with_alpha (hdc);
 
       cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key,
                                   impl, gdk_win32_cairo_surface_destroy);